package aliyun

// type imageDetection struct {
// 	scenes      []string       // 场景
// 	callbackUrl string         // 回调地址
// 	syncReq     *imageSyncReq  // 同步
// 	asyncReq    *imageAsyncReq // 异步
// }
// type imageReq struct {
// 	BizType *string  `json:"bizType,omitempty"` // 该字段用于标识您的业务场景。
// 	Scenes  []string `json:"scenes"`            // 指定检测场景，取值：antispam，表示文本内容检测
// 	// 指定检测对象，JSON数组中的每个元素是一个检测任务结构体。最多支持100个元素，即每次提交100条内容进行检测，支持100个元素的前提是需要将并发任务调整到100个以上。关于每个元素的具体结构描述，请参见textSyncTask
// 	Tasks []*imageReqTask `json:"tasks"`
// }
// type imageReqTask struct {
// 	ClientInfo interface{} `json:"clientInfo,omitempty"` // 客户端信息
// 	// 检测对象对应的数据ID。
// 	// 由大小写英文字母、数字、下划线（_）、短划线（-）、英文句号（.）组成，不超过128个字符，可以用于唯一标识您的业务数据。
// 	DataId *string `json:"dataId,omitempty"`
// 	// 检测对象的URL。
// 	// 公网HTTP/HTTPS URL，且长度不超过2048个字符。
// 	// 阿里云OSS提供的文件路径。您需要先授权内容安全访问OSS存储空间，仅限相同区域的OSS空间。更多信息，请参见授权内容安全访问OSS存储空间。
// 	// 文件路径格式：oss://<bucket-name>.<endpoint>/<object-name>
// 	Url string `json:"url"`
// 	// 截帧频率，GIF图、长图检测专用。
// 	// GIF图可理解为图片数组，interval参数指定了每隔多少张图片抽取一帧进行检测。只有该值存在时，才会对GIF进行截帧。
// 	// 长图分为长竖图和长横图。
// 	// 对长竖图（高大于400像素（px），高宽比大于2.5），按照（高：宽）取整来计算总图数，并进行切割。
// 	// 对长横图（宽大于400像素（px），宽高比大于2.5），按照（宽：高）取整来计算总图数，并进行切割。
// 	// 默认只会检测GIF图、长图的第一帧，interval参数用于指示后台在检测时可按照该间隔跳着检测，以节省检测成本。
// 	Interval  *uint `json:"interval,omitempty"`
// 	MaxFrames *uint `json:"maxFrames,omitempty"` // 最大截帧数量，GIF图、长图检测专用，默认值为1。
// }
//
// type imageSyncReq struct {
// 	imageReq
// }
// type imageSyncResp struct {
// 	yunDunResp
// 	Data []*imageSyncRespData `json:"data"`
// }
// type imageSyncRespData struct {
// 	yunDunResp
// 	DataId string `json:"dataId"` // 检测对象对应的数据ID。
// 	Extras struct {
// 	} `json:"extras"`
// 	Results []struct {
// 		// 置信度分数，取值范围：0（表示置信度最低）~100（表示置信度最高）。
// 		// 如果suggestion为pass，则置信度越高，表示内容正常的可能性越高；如果suggestion为review或block，则置信度越高，表示内容违规的可能性越高。
// 		Rate float64 `json:"rate"`
// 		// 建议您执行的后续操作。取值：
// 		// pass：结果正常，无需进行其余操作。
// 		// review：结果不确定，需要进行人工审核。
// 		// block：结果违规，建议直接删除或者限制公开。
// 		Suggestion string `json:"suggestion"`
// 		/**
// 		检测结果的分类。不同检测场景的结果分类不同，具体如下：
// 		图片智能鉴黄（porn）结果分类：
// 		normal：正常
// 		sexy：性感
// 		porn：色情
// 		图片暴恐涉政（terrorism）结果分类：
// 		normal：正常
// 		bloody：血腥
// 		explosion：爆炸烟光
// 		outfit：特殊装束
// 		logo：特殊标识
// 		weapon：武器
// 		politics：涉政
// 		violence：打斗
// 		crowd：聚众
// 		parade：游行
// 		carcrash：车祸现场
// 		flag：旗帜
// 		location：地标
// 		drug：涉毒
// 		gamble：赌博
// 		others：其他
// 		图文违规（ad）结果分类：
// 		normal：正常
// 		ad：其他广告
// 		politics：文字含涉政内容
// 		porn：文字含涉黄内容
// 		abuse：文字含辱骂内容
// 		terrorism：文字含暴恐内容
// 		contraband：文字含违禁内容
// 		spam：文字含其他垃圾内容
// 		npx：牛皮癣广告
// 		qrcode：含二维码
// 		programCode：含小程序码
// 		图片二维码（qrcode）结果分类：
// 		normal：正常
// 		qrcode：含二维码
// 		programCode：含小程序码
// 		图片不良场景（live）结果分类：
// 		normal：正常
// 		meaningless：图片中无内容（例如黑屏、白屏）
// 		PIP：画中画
// 		smoking：吸烟
// 		drivelive：车内直播
// 		drug：涉毒
// 		gamble：赌博
// 		图片logo（logo）结果分类：
// 		normal：正常
// 		TV：含受管控的logo
// 		trademark：含商标
// 		*/
// 		Label string `json:"label"`
// 		// 图片检测场景，和调用请求中的场景对应。取值：
// 		// porn：图片智能鉴黄
// 		// terrorism：图片暴恐涉政
// 		// ad：图文违规
// 		// qrcode：图片二维码
// 		// live：图片不良场景
// 		// logo：图片logo
// 		Scene string `json:"scene"`
// 		// 识别出的人脸信息
// 		SfaceData []struct {
// 			Faces []struct {
// 				// id：字符串类型，人脸ID。
// 				Id string `json:"id"`
// 				// name：字符串类型，相似人物的名称。
// 				Name string `json:"name"`
// 				// 浮点数类型，置信度分数，取值范围：0（表示置信度最低）~100（表示置信度最高）。置信度越高表示人物识别结果的可信度越高。
// 				Rate float64 `json:"rate"`
// 			} `json:"faces"`
// 			// 人脸区域高度，单位：像素。
// 			H int `json:"h"`
// 			// 人脸区域宽度，单位：像素。
// 			W int `json:"w"`
// 			// 以图片左上角为坐标原点，人脸区域左上角到y轴距离，单位：像素。
// 			X int `json:"x"`
// 			// 以图片左上角为坐标原点，人脸区域左上角到x轴距离，单位：像素。
// 			Y int `json:"y"`
// 		} `json:"sfaceData,omitempty"`
// 		Extras struct {
// 			Qrcodes          string `json:"qrcodes"`
// 			Npx              string `json:"npx"`
// 			HitCustomLibCode string `json:"hitCustomLibCode"`
// 			HitCustomLibName string `json:"hitCustomLibName"`
// 			HitLibInfo       []struct {
// 				Context string `json:"context"`
// 				LibCode string `json:"libCode"`
// 				LibName string `json:"libName"`
// 			} `json:"hitLibInfo"`
// 		} `json:"extras,omitempty"`
// 		ProgramCodeData []struct {
// 			// 小程序码区域宽度，单位：像素。
// 			W float64 `json:"w"`
// 			// 小程序码区域高度，单位：像素。
// 			H float64 `json:"h"`
// 			// 以图片左上角为坐标原点，小程序码区域左上角到y轴距离，单位：像素。
// 			X float64 `json:"x"`
// 			// 以图片左上角为坐标原点，小程序码区域左上角到x轴距离，单位：像素。
// 			Y float64 `json:"y"`
// 		} `json:"programCodeData,omitempty"`
// 		// 如果待检测图片因为过长被截断，该参数返回截断后的每一帧图像的临时访问地址。具体结构描述请参见frame。
// 		Frames []struct {
// 			// 置信度分数，取值范围：0~100，置信度越高表示检测结果的可信度越高。建议您不要在业务中使用该分数。
// 			Rate float64 `json:"rate"`
// 			// 被截断的图片的临时访问URL，地址有效期是5分钟。
// 			Url string `json:"url"`
// 		} `json:"frames,omitempty"`
// 		QrcodeData []string `json:"qrcodeData,omitempty"`
// 		LogoData   []struct {
// 			// 识别出的logo名称。
// 			Name string `json:"name"`
// 			// 识别出的logo类型，取值为TV（台标）。
// 			Type string `json:"type"`
// 			// 以图片左上角为坐标原点，logo区域左上角到y轴距离，单位：像素。
// 			X int `json:"x"`
// 			// 以图片左上角为坐标原点，logo区域左上角到x轴距离，单位：像素。
// 			Y int `json:"y"`
// 			// logo区域宽度，单位：像素。
// 			W int `json:"w"`
// 			// logo区域高度，单位：像素。
// 			H int `json:"h"`
// 		} `json:"logoData,omitempty"`
// 	} `json:"results"`
// 	TaskId string `json:"taskId"` // 检测任务的ID。
// 	// 检测对象的URL。
// 	// 公网HTTP/HTTPS URL，且长度不超过2048个字符。
// 	// 阿里云OSS提供的文件路径。您需要先授权内容安全访问OSS存储空间，仅限相同区域的OSS空间。更多信息，请参见授权内容安全访问OSS存储空间。
// 	// 文件路径格式：oss://<bucket-name>.<endpoint>/<object-name>
// 	Url string `json:"url"`
// }
//
// type imageCallbackHookFunc func(r *ghttp.Request, paramsReq *ImageAsyncAuditCallbackReq)
//
// var imageCallback imageCallbackHookFunc
//
// func (r *imageDetection) CreateSyncReq() *imageSyncReq {
// 	r.syncReq = &imageSyncReq{}
// 	r.syncReq.Scenes = r.scenes
// 	return r.syncReq
// }
// func (r *imageDetection) CreateAsyncReq() *imageAsyncReq {
// 	r.asyncReq = &imageAsyncReq{}
// 	r.asyncReq.Scenes = r.scenes
// 	if r.callbackUrl != "" {
// 		r.asyncReq.Callback = r.callbackUrl
// 	}
// 	return r.asyncReq
// }
// func (*imageDetection) RegisterCallbackHook(fn imageCallbackHookFunc) {
// 	imageCallback = fn
// }
// func (*imageDetection) callback(r *ghttp.Request) {
// 	var paramsReq *ImageAsyncAuditCallbackReq
// 	if err := gjson.DecodeTo(r.Request.FormValue("content"), &paramsReq); err != nil {
// 		net.NewResponse(r).ResponseBadRequest(err.Error())
// 	}
// 	if imageCallback != nil {
// 		go imageCallback(r, paramsReq)
// 	}
// 	net.NewResponse(r).ResponseOk()
// }
//
// func (r *imageSyncReq) AddTask(dataId *string, url string) *imageSyncReq {
// 	r.Tasks = append(r.Tasks, &imageReqTask{
// 		DataId: dataId,
// 		Url:    url,
// 	})
// 	return r
// }
// func (r *imageSyncReq) Scan() (*imageSyncResp, error) {
// 	if r == nil {
// 		return nil, errors.New(errMsgYunDunClientUninitialized)
// 	}
//
// 	// 简单参数校验
// 	{
// 		// task校验
// 		if len(r.Tasks) == 0 {
// 			return nil, errors.New(errMsgYunDunNoTaskAdd)
// 		}
//
// 	}
//
// 	// 获取句柄
// 	client, err := ContentModeration.getInstance()
// 	if client == nil {
// 		return nil, err
// 	}
//
// 	// 创建
// 	request := green.CreateImageSyncScanRequest()
// 	{
// 		bs, err := gjson.Encode(*r)
// 		if err != nil {
// 			return nil, err
// 		}
// 		request.SetContent(bs)
// 	}
//
// 	// 发起
// 	if response, _err := client.ImageSyncScan(request); _err != nil {
// 		return nil, _err
// 	} else {
// 		// 网络请求失败
// 		if response.GetHttpStatus() != 200 {
// 			return nil, errors.New(http.StatusText(response.GetHttpStatus()))
// 		}
// 		// 转换
// 		var paramsResp *imageSyncResp
// 		if err := gconv.Scan(response.GetHttpContentBytes(), &paramsResp); err != nil {
// 			return nil, err
// 		}
// 		return paramsResp, nil
// 	}
// }
//
// type imageAsyncReq struct {
// 	imageReq
// 	Callback  string  `json:"callback,omitempty"`  // 回调地址
// 	Seed      *string `json:"seed,omitempty"`      // 随机字符串，该值用于回调通知请求中的签名。
// 	CryptType *string `json:"cryptType,omitempty"` // 使用回调通知时（callback），设置对回调通知内容进行加密的算法。
// 	Offline   *bool   `json:"offline,omitempty"`   // 指定检测模式， 取值范围
// }
// type imageAsyncResp struct {
// 	yunDunResp
// 	Data []*imageAsyncRespData `json:"data"`
// }
// type imageAsyncRespData struct {
// 	Code   int    `json:"code"`
// 	Msg    string `json:"msg"`
// 	DataId string `json:"dataId"`
// 	TaskId string `json:"taskId"`
// 	Url    string `json:"url"`
// }
// type ImageAsyncAuditCallbackReq struct {
// 	yunDunBase
// 	DataId string `json:"dataId"`
// 	Extras *struct {
// 		FrameCount  string `json:"frameCount"`
// 		FramePrefix string `json:"framePrefix"`
// 	} `json:"extras,omitempty"`
// 	Results []*struct {
// 		Label      string  `json:"label"`
// 		Rate       float64 `json:"rate"`
// 		Scene      string  `json:"scene"`
// 		Suggestion string  `json:"suggestion"`
// 	} `json:"results,omitempty"`
// 	TaskId string `json:"taskId"`
// 	Url    string `json:"url"`
// }
//
// func (r *imageAsyncReq) SetSeed(seed *string) *imageAsyncReq {
// 	r.Seed = seed
// 	return r
// }
// func (r *imageAsyncReq) AddTask(dataId *string, url string) *imageAsyncReq {
// 	r.Tasks = append(r.Tasks, &imageReqTask{
// 		DataId: dataId,
// 		Url:    url,
// 	})
// 	return r
// }
// func (r *imageAsyncReq) Scan() (*imageAsyncResp, error) {
// 	if r == nil {
// 		return nil, errors.New(errMsgYunDunClientUninitialized)
// 	}
// 	if len(r.Tasks) == 0 {
// 		return nil, errors.New(errMsgYunDunNoTaskAdd)
// 	}
//
// 	client, err := ContentModeration.getInstance()
// 	if client == nil {
// 		return nil, err
// 	}
//
// 	request := green.CreateImageAsyncScanRequest()
// 	{
// 		bs, err := gjson.Encode(*r)
// 		if err != nil {
// 			return nil, err
// 		}
// 		request.SetContent(bs)
// 	}
//
// 	if response, _err := client.ImageAsyncScan(request); _err != nil {
// 		return nil, _err
// 	} else {
// 		// 网络请求失败
// 		if response.GetHttpStatus() != 200 {
// 			return nil, errors.New(http.StatusText(response.GetHttpStatus()))
// 		}
// 		// 转换
// 		var paramsResp *imageAsyncResp
// 		if err := gconv.Scan(response.GetHttpContentBytes(), &paramsResp); err != nil {
// 			return nil, err
// 		}
// 		return paramsResp, nil
// 	}
// }
